home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / vbcc.lha / vbcc / pasm / errors.c < prev    next >
C/C++ Source or Header  |  1998-02-17  |  7KB  |  218 lines

  1. /* $VER: pasm errors.c V0.7 (02.01.98)
  2.  *
  3.  * This file is part of pasm, a portable PowerPC assembler.
  4.  * Copyright (c) 1997-98  Frank Wille
  5.  *
  6.  * pasm is freeware and part of the portable and retargetable ANSI C
  7.  * compiler vbcc, copyright (c) 1995-98 by Volker Barthelmann.
  8.  * pasm may be freely redistributed as long as no modifications are
  9.  * made and nothing is charged for it. Non-commercial usage is allowed
  10.  * without any restrictions.
  11.  * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
  12.  * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
  13.  *
  14.  *
  15.  * v0.7 (02.01.98) phx
  16.  *      Deleted "EHF" in warning 52.
  17.  * v0.6 (30.10.97) phx
  18.  *      New error messages.
  19.  * v0.5 (12.10.97) phx
  20.  *      New error messages.
  21.  * v0.4 (05.07.97) phx
  22.  *      Program returns EXIT_FAILURE if an error occurs.
  23.  *      New error messages. Error 33 is a warning now.
  24.  * v0.2 (25.03.97) phx
  25.  *      Writes ELF object for 32-bit PowerPC big-endian. Either absolute
  26.  *      or ELF output format may be selected. ELF is default for all
  27.  *      currently supported platforms. PPCasm supports nine different
  28.  *      relocation types (there are much more...).
  29.  *      Compiles and works also under NetBSD/amiga (68k).
  30.  *      Changed function declaration to 'new style' in all sources
  31.  *      (to avoid problems with '...' for example).
  32.  *      Warnings can be disabled.
  33.  * v0.1 (11.03.97) phx
  34.  *      First test version with all PowerPC instructions and most
  35.  *      important directives. Only raw, absolute output.
  36.  * v0.0 (14.02.97) phx
  37.  *      File created. Project started.
  38.  */
  39.  
  40.  
  41. #define ERRORS_C
  42. #include "ppcasm.h"
  43.  
  44.  
  45. /* error flags */
  46. #define EF_NONE 0
  47. #define EF_WARNING 1
  48. #define EF_ERROR 2
  49. #define EF_FATAL 3
  50. #define EF_TYPEMASK 0xf
  51.  
  52. #define EF_NOLINE 0x10
  53.  
  54.  
  55. void error(int,...);
  56. void ierror(char *,...);
  57.  
  58.  
  59.  
  60. static struct {
  61.   char *txt;
  62.   int flags;
  63. } errors[] = {
  64.   "No error",EF_NONE|EF_NOLINE,
  65.   "Out of memory",EF_FATAL|EF_NOLINE,                               /* 01 */
  66.   "Missing source file name",EF_FATAL|EF_NOLINE,
  67.   "Missing output file name",EF_FATAL|EF_NOLINE,
  68.   "Multiple source file names detected",EF_FATAL|EF_NOLINE,
  69.   "File \"%s\" has a read error",EF_FATAL|EF_NOLINE,                /* 05 */
  70.   "Can't open \"%s\"",EF_FATAL|EF_NOLINE,
  71.   "Symbol \"%s\" defined twice",EF_ERROR,
  72.   "Macro \"%s\" defined twice",EF_ERROR,
  73.   "Reference to undefined macro parameter \\%d",EF_ERROR,
  74.   "Unknown opcode \"%s\"",EF_ERROR,                                 /* 10 */
  75.   "Too many macro parameters",EF_ERROR,
  76.   "Colon expected",EF_ERROR,
  77.   "Syntax error",EF_ERROR,
  78.   "String constant expected",EF_ERROR,
  79.   "Illegal section attribute \"%c\"",EF_ERROR,                      /* 15 */
  80.   "Section attributes don't match",EF_ERROR,
  81.   "Missing argument",EF_ERROR,
  82.   "Extra characters on line",EF_ERROR,
  83.   "Undefined symbol",EF_ERROR,
  84.   "Double unary operator",EF_ERROR,                                 /* 20 */
  85.   "Missing closing parenthesis",EF_ERROR,
  86.   "Illegal operation for a reloc expression",EF_ERROR,
  87.   "Symbols reside in different sections",EF_ERROR,
  88.   "Constant integer expression required",EF_ERROR,
  89.   "Unable to create output file \"%s\"",EF_FATAL|EF_NOLINE,         /* 25 */
  90.   "Error while writing to \"%s\"",EF_FATAL|EF_NOLINE,
  91.   "Instruction has too few operands",EF_ERROR,
  92.   "Can't assign external symbol",EF_ERROR,
  93.   "Can't assign reloc half word",EF_ERROR,
  94.   "Immediate operand doesn't fit into %d bits",EF_WARNING,          /* 30 */
  95.   "Register operand out of range",EF_ERROR,
  96.   "Reloc symbol required",EF_ERROR,
  97.   "Branch destination is not in current section",EF_WARNING,
  98.   "Branch operand out of range",EF_ERROR,
  99.   "CR-specifier out of range",EF_ERROR,                             /* 35 */
  100.   "Operand field \"%s\" out of range",EF_ERROR,
  101.   "\"%s\" is a 64-bit instruction",EF_WARNING,
  102.   "\"%s\" is an optional instruction",EF_WARNING,
  103.   "\"%s\" is a supervisor-level instruction",EF_WARNING,
  104.   "\"(rA)\" expected, after index expression",EF_ERROR,             /* 40 */
  105.   "Expression must be dividable by four",EF_ERROR,
  106.   "Invalid register field mask",EF_ERROR,
  107.   "Maximum nesting depth for conditional assembly exceeded",EF_ERROR,
  108.   "%s without matching .if",EF_ERROR,
  109.   "\"fail\" directive encountered",EF_FATAL,                        /* 45 */
  110.   "Symbol is not part of a base-relative section",EF_ERROR,
  111.   "Section \"%s\" was never defined",EF_ERROR,
  112.   "Option -%c: argument expected",EF_FATAL|EF_NOLINE,
  113.   "Unknown output format (%d)",EF_FATAL|EF_NOLINE,
  114.   "\"%s\" is not a section base address",EF_ERROR,                  /* 50 */
  115.   "Maximum of %d include paths reached. Path \"%s\" was ignored",
  116.     EF_ERROR|EF_NOLINE,
  117.   "Section \"%s\" with type #%d is not supported and was "
  118.     "changed to HUNK_DATA.",EF_WARNING|EF_NOLINE,
  119.   "Unsupported relocation type %s at offset %d in section \"%s\"",
  120.     EF_ERROR|EF_NOLINE,
  121.   "Option -%c: integer expected",EF_FATAL|EF_NOLINE,
  122.   "Absolute output doesn't allow external references. Symbol "      /* 55 */
  123.    "referenced was: %s",EF_ERROR|EF_NOLINE,
  124.   "Option -%c: symbol name expected",EF_FATAL|EF_NOLINE,
  125.   "Unknown assembler mode -m%s",EF_WARNING|EF_NOLINE,
  126. };
  127.  
  128.  
  129. void error(int errn,...)
  130. /* prints errors and warnings */
  131. {
  132.   struct GlobalVars *gv = &gvars;
  133.   va_list vl;
  134.   char *errtype;
  135.   int flags = errors[errn].flags;
  136.   struct SourceThread *mst,*st = gv->cthread;
  137.  
  138.   if (((flags&EF_TYPEMASK) == EF_WARNING) && gv->dontwarn)
  139.     return;
  140.   switch(flags&EF_TYPEMASK) {
  141.     case EF_WARNING:
  142.       errtype = "Warning";
  143.       break;
  144.     case EF_ERROR:
  145.       gv->returncode = EXIT_FAILURE;
  146.       errtype = "Error";
  147.       break;
  148.     case EF_FATAL:
  149.       gv->returncode = EXIT_FAILURE;
  150.       errtype = "Fatal error";
  151.       break;
  152.     default:
  153.       ierror("Illegal error type %d",flags&EF_TYPEMASK);
  154.       gv->returncode = EXIT_FAILURE;
  155.       errtype = "";
  156.       break;
  157.   }
  158.   if (!(flags&EF_NOLINE))
  159.     printf("\n%s\n",st->lineptr);  /* display error line */
  160.  
  161.   /* print error message */
  162.   printf("%s %d: ",errtype,errn);
  163.   va_start(vl,errn);
  164.   vprintf(errors[errn].txt,vl);
  165.   va_end(vl);
  166.   
  167.   if (!(flags&EF_NOLINE)) {
  168.     if (st->macro) {
  169.       mst = st;
  170.       do
  171.         if (!(mst = mst->prev))
  172.           ierror("There's no source text where macro \"%s\" is "
  173.                  "called from",st->csource->name);
  174.       while (mst->macro);
  175.       printf(" in line %d of macro \"%s\", called from line %d of "
  176.              "file \"%s\"",(int)st->line,st->csource->name,
  177.              (int)mst->line,mst->csource->name);
  178.     }
  179.     else
  180.       printf(" in line %d of file \"%s\"",(int)st->line,st->csource->name);
  181.   }
  182.   printf(".\n");
  183.  
  184.   switch(flags&EF_TYPEMASK) {
  185.     case EF_ERROR:
  186.       /* check if maximum number of errors reached */
  187.       if (++gv->errcnt >= gv->maxerrors) {
  188.         gv->errcnt = 0;
  189.         printf("Do you want to continue (y/n) ? ");
  190.         fflush(stdin);
  191.         if (toupper((unsigned char)getchar()) == 'N')
  192.           cleanup(gv);
  193.       }
  194.       break;
  195.     case EF_FATAL:
  196.       printf("Aborting.\n");  /* fatal error aborts the assembler */
  197.       cleanup(gv);
  198.       break;
  199.   }
  200. }
  201.  
  202.  
  203. void ierror(char *errtxt,...)
  204. /* display internal error and quit */
  205. {
  206.   struct GlobalVars *gv = &gvars;
  207.   struct SourceThread *st = gv->cthread;
  208.   va_list vl;
  209.  
  210.   printf("\nINTERNAL ERROR: ");
  211.   va_start(vl,errtxt);
  212.   vprintf(errtxt,vl);
  213.   va_end(vl);
  214.   printf(" in line %d of \"%s\".\nAborting.\n",(int)st->line,
  215.          st->csource->name);
  216.   cleanup(gv);
  217. }
  218.